package com.cctc.juc.source.Athread;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
 * [RunnableFuture 接口] 实现类。
 * 概述：FutureTask 是 RunnableFuture 接口的一个实现类，可以将 Callable 转换成 Runnable 和 Future，是这两个接口的胶水类。
 * FutureTask 作为一个异步任务，可以传递给 Thread 对象或提交给 Executor 线程池去执行，并提供了一些异步任务交互方法，例如取消任务、查询任务是否执行完成以及（阻塞式）获取任务执行结果等。
 * 应用场景：如果在主线程中需要执行一些比较耗时的操作，但又不想阻塞主线程，可以把这些操作交给 FutureTask 对象在后台异步执行，当主线程未来需要时，可以随时通过 FutureTask 对象获取这些操作的执行状态以及计算结果。
 * 核心流程：Thread.run() -> FutureTask.run() -> Callable.run()。
 * 1. 创建一个 Callable 接口的实现类，实现 call() 方法，编写异步任务的执行逻辑，可以有返回值；
 * 2. 创建一个 FutureTask 实例，构造器中传入 1 中创建的 Callable 接口的实现类；
 * 3. 创建一个 Thread 线程，或使用线程池中的线程，执行 FutureTask 异步任务；
 * 4. 调用 FutureTask 实例的 get() 方法，（[限时] 阻塞）获取任务执行结果。
 */
public class FFutureTask<V> implements ERunnableFuture<V> {
    // --- [核心] 属性 --- //
    // 当前执行 Callable 异步任务的线程
    private volatile Thread runner;
    // 异步任务
    private Callable<V> callable;
    // 异步任务执行结果
    private Object outcome;

    // --- [常用] 构造器 --- //

    public FFutureTask(Callable<V> callable) {
        if (callable == null) throw new NullPointerException();
        this.callable = callable;
        // ... 省略代码 ...
    }

    // --- [常用] 方法 --- //

    /**
     * 执行任务，保存结果。
     * - this.run() [ = runnable.run() ] -> callable.run() -> [result -> outcome]。
     */
    @Override
    public void run() {
        // ... 省略代码 ...
    }

    /**
     * 取消（中断）正在执行中的任务。
     * - runner.interrupt()。
     */
    @Override
    public boolean cancel(boolean mayInterruptIfRunning) {
        // ... 省略代码 ...
        return false;
    }

    /**
     * 判断任务是否被取消？
     * - mayInterruptIfRunning = true。
     */
    @Override
    public boolean isCancelled() {
        // ... 省略代码 ...
        return false;
    }

    /**
     * 判断任务是否执行结束？
     */
    @Override
    public boolean isDone() {
        // ... 省略代码 ...
        return false;
    }

    /**
     * （阻塞）获取任务执行结果。
     * - return [outcome]。
     */
    @Override
    public V get() throws InterruptedException, ExecutionException {
        // ... 省略代码 ...
        return null;
    }

    /**
     * （限时阻塞）获取任务执行结果。
     * - return [outcome] 或 throw new TimeoutException()。
     */
    @Override
    public V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
        // ... 省略代码 ...
        return null;
    }
}
